#!/usr/bin/perl
use warnings;
use strict;
use error_check_module;
use interface_check_module;
use options_module;

unless(_Option::who_are_you() eq 'root'){
	die "Running this program requires root previlege! \n";
}

my %flags = (
	"--range" => "off",
	"--only-ap" =>"off",
	"--only-clients" => "off",
	"--no-thread" => "off",
);

my ($option_string,$error_check);
$error_check = _Error::option_check(\$option_string,\%flags,\@ARGV);
if($error_check == 0){ print "process "; }
else{ _Error::print_error(\$error_check); }

#인터페이스에 관련된 에러체크와 함수 실행한다.
my $interface;
$error_check = _Interface::interface_related(\$interface,\@ARGV);
if($error_check == 0){ print "- "; }
else{ _Error::print_error(\$error_check); }

#인터페이스의 IP와 Network Address를 만든다. 
my ($my_ip,$network_address);
$error_check = _Interface::get_ip_and_net_addr(\$interface,\$my_ip,\$network_address);
if($error_check == 0){ print "- "; }
else{ _Error::print_error(\$error_check); }

#현재 네트워크에 존재하는 호스트들을 스캔해서 IP와 MAC을 배열로 리턴한다.
my (@host_ips,@host_macs);
$error_check = _Option::get_alive_hosts_ips_macs(\$interface,\$network_address,\@host_ips,\@host_macs);
if($error_check == 0){ print "- "; }
else{ _Error::print_error(\$error_check); }

#실행한 시점에서 살아있는 호스트의 수와 각각의 IP와 MAC을 출력하고 종료한다
$error_check = _Option::print_alive_host(\@host_ips,\@host_macs,\$option_string);
if($error_check == 0){ print "- "; }

my $max_index = $#host_ips;
my $max_host = $#host_ips+1;

#kernel level packet forwarding
#dangerous!!!
`echo 1 > /proc/sys/net/ipv4/ip_forward`;

$error_check = _Option::initiate_arpspoofing(\$interface,\$option_string,\@ARGV,\@host_ips);
if($error_check == 0){ print "- done, \'exit\' to kill process \n"; }
else{ _Error::print_error(\$error_check); }

$error_check = _Option::give_user_a_shell(\$interface,\$network_address,\$option_string,\@ARGV,\@host_ips);
if($error_check == 0){ }
else{ }

$error_check = _Option::kill_on_going_arpspoofing();

if($error_check == 0){ }
else{ }
